from os import environ
from typing import Optional
import asyncio

from openmeter.aio import Client
from corehttp.exceptions import HttpResponseError

ENDPOINT: str = environ.get("OPENMETER_ENDPOINT") or "https://openmeter.cloud"
token: Optional[str] = environ.get("OPENMETER_TOKEN")
customer_key: str = environ.get("OPENMETER_CUSTOMER_KEY") or "acme-corp-1"
feature_key: str = environ.get("OPENMETER_FEATURE_KEY") or "api_access"


async def main() -> None:
    async with Client(
        endpoint=ENDPOINT,
        token=token,
    ) as client:
        try:
            # Check customer access to a specific feature
            print(f"Checking access for customer '{customer_key}' to feature '{feature_key}'...")

            entitlement_value = await client.customer_entitlement.get_customer_entitlement_value(
                customer_key, feature_key
            )

            print(f"\nEntitlement Value:")
            print(f"Has Access: {entitlement_value.has_access}")

            # For metered entitlements, additional properties are available
            if entitlement_value.balance is not None:
                print(f"Balance: {entitlement_value.balance}")
            if entitlement_value.usage is not None:
                print(f"Usage: {entitlement_value.usage}")
            if entitlement_value.overage is not None:
                print(f"Overage: {entitlement_value.overage}")

            # For static entitlements, config is available
            if entitlement_value.config is not None:
                print(f"Config: {entitlement_value.config}")

            # List customer entitlements and demonstrate type-specific handling
            print(f"\nListing all entitlements for customer '{customer_key}'...")
            entitlements_response = await client.customer_entitlements_v2.list(customer_key)

            print(f"\nEntitlements by Type:")
            for entitlement in entitlements_response.items_property:
                # Note: Due to a deserialization issue in the SDK, items come back as dicts
                # Access fields using dict syntax or .get()
                print(f"\n  Feature: {entitlement.get('featureKey')}")
                print(f"  ID: {entitlement.get('id')}")

                # Handle different entitlement types using discriminator
                entitlement_type = entitlement.get("type")
                if entitlement_type == "metered":
                    # Metered entitlement
                    print(f"  Type: Metered")
                    print(f"  Soft Limit: {entitlement.get('isSoftLimit')}")
                    if entitlement.get("issueAfterReset") is not None:
                        print(f"  Issue After Reset: {entitlement.get('issueAfterReset')}")
                elif entitlement_type == "static":
                    # Static entitlement
                    print(f"  Type: Static")
                    if entitlement.get("config") is not None:
                        print(f"  Config: {entitlement.get('config')}")
                elif entitlement_type == "boolean":
                    # Boolean entitlement
                    print(f"  Type: Boolean")

            # Get overall customer access to all features
            print(f"\nGetting overall access for customer '{customer_key}'...")
            customer_access = await client.customer.get_customer_access(customer_key)

            print(f"\nCustomer Access Summary:")
            print(f"Total entitlements: {len(customer_access.entitlements)}")
            for feature, value in customer_access.entitlements.items():
                access_status = "✓" if value.has_access else "✗"
                print(f"  {access_status} {feature}: has_access={value.has_access}")
                if value.balance is not None:
                    print(f"    Balance: {value.balance}")
                if value.usage is not None:
                    print(f"    Usage: {value.usage}")

        except HttpResponseError as e:
            print(f"Error: {e}")


asyncio.run(main())
